package com.ccovo.controller;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.session.TokenSign;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.ccovo.domain.po.User;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * Sa-Token 会话查询示例
 *
 * @author click33
 * @since 2022-10-17
 */
@RestController
@Api(tags = "会话查询示例")
@RequestMapping("/search/")
public class SearchSessionController {

	/*
	 * 测试步骤：
	 	1、先登录5个账号
	 		 ---- http://localhost:8081/search/login?userId=10001&张三&age=18
	 		 ---- http://localhost:8081/search/login?userId=10002&李四&age=20
	 		 ---- http://localhost:8081/search/login?userId=10003&王五&age=22
	 		 ---- http://localhost:8081/search/login?userId=10004&赵六&age=24
	 		 ---- http://localhost:8081/search/login?userId=10005&冯七&age=26

	 	2、根据分页参数获取会话列表
	 		http://localhost:8081/search/getList?start=0&size=10
	 */

    // 会话登录接口  ---- http://localhost:8081/search/login?userId=10001&张三&age=18
    @PostMapping("login")
    public SaResult login(long userId, String name, String phone) {
        // 先登录上
        StpUtil.login(userId);

        // 再把 User 对象存储在 SaSession 上
        User user = new User();
        user.setId(userId);
        user.setName(name);
        user.setPhone(phone);
        StpUtil.getSession().set("user", user);

        // 返回
        return SaResult.ok("账号登录成功");
    }

    // 会话查询接口  ---- http://localhost:8081/search/getList?start=0&size=10
    @GetMapping("getList")
    public SaResult getList(int start, int size) {
        // 获取所有已登录的会话id
        List<String> sessionIdList = StpUtil.searchSessionId("", start, size, false);

        for (String sessionId : sessionIdList) {

            // 根据会话id，查询对应的 SaSession 对象，此处一个 SaSession 对象即代表一个登录的账号
            SaSession session = StpUtil.getSessionBySessionId(sessionId);

            // 查询这个账号都在哪些设备登录了，依据上面的示例，账号A 的 tokenSign 数量是 3，账号B 的 tokenSign 数量是 2
            List<TokenSign> tokenSignList = session.getTokenSignList();
            System.out.println("会话id：" + sessionId + "，共在 " + tokenSignList.size() + " 设备登录");
        }

        // 返回
        return SaResult.data(sessionIdList);
    }

    // 会话查询接口  ---- http://localhost:8081/disable/logout
    @PostMapping("logout")
    public SaResult logout() {
        StpUtil.logout();
        return SaResult.ok("账号退出成功");
    }

}